
#include <vector_types.h>
#include <math_functions.h>

struct Particula {
    float3 velocidade;
    float massaEspecifica;
    float pressao;
    float3 forcaPressao;
    float3 forcaVisc;
    float3 forcaAceleracao;
};

__global__ void AceleracaoKernel(Particula* particulasT, int numeroParticulas, unsigned int* values) {
    int thread = threadIdx.x;
    int block = blockIdx.x;
    int dim = blockDim.x;
    int indiceValue = dim * block + thread;
    //float3 gravidade = {0.0f, -9.8f, 0.0f};
    float3 gravidade = {0.0f, 0.0f, 0.0f};

    if (indiceValue < numeroParticulas) {
        int indiceParticulaAtual = values[indiceValue];

        particulasT[indiceParticulaAtual].forcaAceleracao.x = particulasT[indiceParticulaAtual].forcaPressao.x + particulasT[indiceParticulaAtual].forcaVisc.x + particulasT[indiceParticulaAtual].massaEspecifica * gravidade.x / particulasT[indiceParticulaAtual].massaEspecifica;
        particulasT[indiceParticulaAtual].forcaAceleracao.y = particulasT[indiceParticulaAtual].forcaPressao.y + particulasT[indiceParticulaAtual].forcaVisc.y + particulasT[indiceParticulaAtual].massaEspecifica * gravidade.y / particulasT[indiceParticulaAtual].massaEspecifica;
        particulasT[indiceParticulaAtual].forcaAceleracao.z = particulasT[indiceParticulaAtual].forcaPressao.z + particulasT[indiceParticulaAtual].forcaVisc.z + particulasT[indiceParticulaAtual].massaEspecifica * gravidade.z / particulasT[indiceParticulaAtual].massaEspecifica;
    }
}

extern "C" void launch_AceleracaoKernel(unsigned int blocksPerGrid, unsigned int threadsPerBlock, Particula* particulasT, int numeroParticulas, unsigned int* values) {
    // execute the kernel
    AceleracaoKernel << <blocksPerGrid, threadsPerBlock >> >(particulasT, numeroParticulas, values);
}

